home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / plotting / iterant / iterant.bas next >
BASIC Source File  |  1991-04-17  |  8KB  |  257 lines

  1. DECLARE SUB help ()
  2. DECLARE SUB getval (z#)
  3. DEFDBL A-H, P-Z
  4. DEFINT I-O
  5.  
  6. ' ITERANT.BAS
  7. '   Generates Iteration plots (such as bifurcation plots) interactively
  8. '   with a primative/simple user interface.
  9. '   Written by J.I. Landman 4/11/91, under QuickBasic version 4.5
  10. '   Copyright 1991, J.I. Landman
  11. '       Permission is granted to distribute,
  12. '   use, copy, generate interesting plots, butcher and enhance the code,
  13. '   with 2 absolute requirements.  1) With the modified program, you must
  14. '   distribute this unmodified code in its original form.  2) Any original
  15. '   work that is published in any Journal/Magazine/Newspaper/Disk/Newsgroups
  16. '   et cetra, based upon this code or its modifications must have a
  17. '   citation of the original code/author (eg me).
  18. '       I place this code entirely within the public domain.  I accept no
  19. '   responsibility for damages incurred from the use and/or misuse of this
  20. '   code/data.  As the great numerical analyst Dr Jack Dongarra has said:
  21. '   "CAVEAT RECEPTOR:  Nothing that is free comes with any guaranty"
  22. '       I can be reached via the mail at
  23. '       J.I. Landman
  24. '       Physics Bldg, 666 Hancock Avenue,
  25. '       Wayne State University, Detroit MI 48202
  26. '   or over the internet/bitnet networks at
  27. '       07480JLN@MSU.BITNET
  28. '       07480JLN@CMS.cc.msu.edu
  29. '       userzv50@mts.cc.wayne.edu
  30. '       userzv50@waynemts.bitnet
  31. '   I invite correspondence, especially about interesting iterants, physics,
  32. '   programming, mathematics, etc.
  33. '
  34.  
  35.  
  36. 'Useful quantities
  37.     xl = -2 'initial window size (physical size is fixed on the
  38.     xh = 1 / 4 ' screen, but not in terms of the area we can view)
  39.     yl = -4
  40.     yh = 4
  41.     npts = 150  ' number of points in a window
  42.  
  43.     ito = 75    '   iteration ending default value
  44.     ifrom = 50  '   iteration starting default value
  45.  
  46.  
  47. 'BEGIN: Main code loop
  48. startup:
  49.     CLS
  50.     SCREEN 3 'change this to suit your screen needs
  51.          ' use screen 2  for CGA
  52.          ' use screen 8,9,10,11,12,13 for EGA/VGA/MCGA
  53.     th = (yh - yl) / 40 '   tic height on y axis being 1/40th the y length
  54.     cth = (xh - xl) / 40'   tic height on x axis ...
  55.  
  56.     LOCATE 22, 40   ' blank the message area
  57.     PRINT SPACE$(39)
  58.     LOCATE 21, 40
  59.     PRINT SPACE$(39)
  60.     LOCATE 20, 40
  61.     PRINT SPACE$(39)
  62.  
  63.  
  64.     VIEW (50, 0)-(500, 222) ' define graphics viewport on screen
  65.                             ' this wont work correctly on 320x200 screen
  66.                             ' modes such as 1.  Change the 500 to 216
  67.                             ' and the 222 to 142
  68.                             ' the text will not work properly in this screen
  69.                             ' mode (320x200)
  70.    
  71.     WINDOW (xl, yl)-(xh, yh)' setup the graphics window dimensions
  72.     LINE (xl, yl)-(xh, yh), , B ' draw a box around it
  73.  
  74.     delc = (xh - xl) / 5    ' begin tic placement
  75.     FOR cx = xl TO xh STEP delc
  76.         LINE (cx, yl)-(cx, yl + th)
  77.         LINE (cx, yh)-(cx, yh - th)
  78.     NEXT
  79.     FOR cx = xl TO xh STEP delc / 2
  80.         LINE (cx, yl)-(cx, yl + th / 2)
  81.         LINE (cx, yh)-(cx, yh - th / 2)
  82.     NEXT
  83.     dely = (yh - yl) / 5
  84.     FOR y = yl TO yh STEP dely
  85.         LINE (xl, y)-(xl + cth, y)
  86.         LINE (xh, y)-(xh - cth, y)
  87.     NEXT
  88.     FOR y = yl TO yh STEP dely / 2
  89.         LINE (xl, y)-(xl + cth / 2, y)
  90.         LINE (xh, y)-(xh - cth / 2, y)
  91.     NEXT
  92.  
  93.     i = 1   ' begin text placement: I tweaked it until it worked on the herc
  94.     'ules screen.  You may need to change the locate statements
  95.     FOR xx = xl TO xh STEP delc
  96.         LOCATE 18, i + 9 * i - 8
  97.         PRINT USING "##.######"; xx
  98.         i = i + 1
  99.     NEXT
  100.     LOCATE 19, 31
  101.     PRINT "X"
  102.     i = 1
  103.     FOR yc = yl TO yh STEP dely
  104.         LOCATE 19 - 3 * i, 57
  105.         PRINT USING "##.######"; yc
  106.         i = i + 1
  107.     NEXT
  108.     LOCATE 9, 67
  109.     PRINT "Y"
  110.  
  111. display:    ' main display loop
  112.     dc = (xl - xh) / npts '  step size along xaxis
  113.  
  114.     LOCATE 21, 4    ' show current values of useful quantities
  115.     PRINT USING "Xlow=##.######,   Xhigh=##.######"; xl; xh
  116.     LOCATE 22, 4
  117.     PRINT USING "Ylow=##.######,   Yhigh=##.######"; yl; yh
  118.     LOCATE 23, 4
  119.     PRINT USING "  npts=######,    from=###, to=###"; npts; ifrom; ito
  120.     LOCATE 21, 40
  121.  
  122.     PRINT "item to change:";    'prompt user for item to change
  123.     LINE INPUT q$   ' get it
  124.     q$ = LTRIM$(RTRIM$(LCASE$(q$))) ' get rid of any spaces and make lowercase
  125.     SELECT CASE q$
  126.     CASE "xl", "xlo", "xlow", "xmin"
  127.         LOCATE 20, 40
  128.         PRINT "Modifying Xlow"
  129.         CALL getval(xl)
  130.         GOTO startup
  131.     CASE "xh", "xhi", "xhigh", "xmax"
  132.         LOCATE 20, 40
  133.         PRINT "Modifying Xhigh"
  134.         CALL getval(xh)
  135.         GOTO startup
  136.     CASE "yl", "ylo", "xlow", "ymin"
  137.         LOCATE 20, 40
  138.         PRINT "Modifying Ylow"
  139.         CALL getval(yl)
  140.         GOTO startup
  141.     CASE "yh", "yhi", "yhigh", "ymax"
  142.         LOCATE 20, 40
  143.         PRINT "Modifying Yhigh"
  144.         CALL getval(yh)
  145.         GOTO startup
  146.     CASE "go", "start", "begin", "plot", "graph", "run", "execute"
  147.         GOTO endofselect
  148.     CASE "end", "quit", "finish", "stop"
  149.         STOP
  150.     CASE "n", "num", "npt", "npts", "number"
  151.         LOCATE 20, 40
  152.         PRINT "Modifying npts"
  153.         xxx = npts
  154.         CALL getval(xxx)
  155.         npts = xxx
  156.     CASE "to", "until", "last"
  157.         LOCATE 20, 40
  158.         PRINT "Modifying TO"
  159.         xito = ito
  160.         CALL getval(xito)
  161.         ito = CINT(xito)
  162.     CASE "from", "first"
  163.         LOCATE 20, 40
  164.         PRINT "Modifying FROM"
  165.         xf = ifrom
  166.         CALL getval(xf)
  167.         ifrom = CINT(xf)
  168.     CASE "clear", "cls", "new"
  169.         GOTO startup
  170.     CASE "help", "?"
  171.         CALL help
  172.         GOTO startup
  173.     CASE ELSE
  174.         LOCATE 21, 40
  175.         PRINT SPACE$(39)
  176.         LOCATE 22, 40
  177.         PRINT SPACE$(39)
  178.         LOCATE 20, 40
  179.         PRINT SPACE$(39)
  180.  
  181.  
  182.         '
  183.     END SELECT  ' end of user interface loop
  184.     LOCATE 20, 40
  185.     PRINT SPACE$(39)
  186.     GOTO display
  187.  
  188.     
  189. endofselect:
  190.  
  191.  
  192.     xn = 0
  193.  
  194.     FOR x = xh TO xl STEP dc
  195.         yn = 0
  196.         i$ = ""
  197.         FOR i = 1 TO ito
  198.         'THIS IS IT!!!! THE NEXT LINE IS ALL THE PROCESSING THIS PROG DOES
  199.             yn = yn * yn + x
  200.  
  201.         '    yn = SQR(ABS(yn)) + x
  202.         ' other interesting ones are
  203.         '   yn=abs(yn)^(-sqr(sqr(sqr(abs(yn)))))+x
  204.         '   yn=yn*sin(yn)+x
  205.         '   yn=yn*cos(yn*yn)+x
  206.  
  207.  
  208.             i$ = INKEY$
  209.             IF (i > ifrom) THEN PSET (x, yn)
  210.             IF i$ <> "" THEN
  211.                 SOUND 60, 1
  212.                 GOTO display
  213.             END IF
  214.         NEXT
  215.     NEXT
  216.     SOUND 70, 1
  217.     GOTO display
  218.  
  219. SUB getval (z)
  220.     LOCATE 21, 40
  221.     PRINT USING "old value = ##.######"; z
  222.     LOCATE 22, 40
  223.     PRINT "New value is:";
  224.     INPUT qq$
  225.     qq$ = LTRIM$(RTRIM$(LCASE$(qq$)))
  226.     IF qq$ <> "" THEN
  227.         x = VAL(qq$)
  228.         IF ((x <> 0) AND (x <> z)) THEN
  229.             z = x
  230.         END IF
  231.     END IF
  232.     LOCATE 21, 40
  233.     PRINT SPACE$(39)
  234.     LOCATE 22, 40
  235.     PRINT SPACE$(39)
  236.  
  237. END SUB
  238.  
  239. SUB help
  240.     SCREEN 0
  241.     CLS
  242.     PRINT "ITERANT by J.I. Landman.  Copyright 1991, by J.I. Landman"
  243.     PRINT " To adjust the parameters, type in the name of the parameter"
  244.     PRINT " at the prompt.  You will be asked for a new value.  If you"
  245.     PRINT " press enter without giving a value, the program will retain the"
  246.     PRINT " current one."
  247.     PRINT "  to start an ITERATION calculation, type the word GO at the"
  248.     PRINT " prompt.  to stop it press any key, and then type the word STOP"
  249.     PRINT
  250.     PRINT "press any key to continue:"
  251.     WHILE INKEY$ = ""
  252.     WEND
  253.     
  254. END SUB
  255.  
  256.